package main

import (
	"fmt"
	"net/http"
	"time"

	"github.com/gin-gonic/gin"
)

// 定义一个中间件m1: 统计请求处理函数的耗时
func m1(c *gin.Context) {
	fmt.Println("m1 in...")
	//计时
	start := time.Now()
	c.Next() //调用后续的处理函数
	//c.Abort() //阻止调用后续的处理函数
	cost := time.Since(start)
	fmt.Printf("cost1:%v\n", cost)
	fmt.Println("m1 out...")
}

// 从上下文中取值(跨中间件取值)
func m2(c *gin.Context) {
	fmt.Println("m2 in...")
	//go funcXX（c.Copy()) //goroutine在funcXX中只能使用c的拷贝 只读
	c.Set("name", "flm")
	fmt.Println("m2 out...")
}

// 通常利用闭包形式写中间件
func authMiddleware(doCheck bool) gin.HandlerFunc {
	//连接数据库
	//或者一些其他的准备工作
	return func(c *gin.Context) {
		if doCheck {
			//存放具体的逻辑
			//是否登陆的判断
			//if 是登陆的用户
			// c.Next()
			// else
			//c.Abort()
		} else {
			fmt.Println("authMiddlewaret in...")
			c.Next()
		}
	}

}

func main() {
	r := gin.Default()
	//中间件可以用于单个路由, 路由组, 全局
	r.Use(m1, m2, authMiddleware(false)) //全局注册中间件函数m1

	r.GET("/user", func(c *gin.Context) {
		name, ok := c.Get("name") // 从上下文中取值
		if !ok {
			name = "匿名用户"
		}
		c.JSON(http.StatusOK, gin.H{
			"msg": name,
		})

	})

	r.Run(":9090")
}
